package com.kater.business;


import com.kater.fruit.Fruit;
import com.kater.promotion.impl.NoPromotion;
import com.kater.promotion.Promotion;
import lombok.Data;

import java.util.HashMap;

/**
 * 购物车类用于管理用户选购的水果和计算总价。
 * 它利用一个哈希表来存储水果及其数量，同时通过一个促销策略对象来计算总价。
 */
@Data
public class ShoppingCart {

    /**
     * 水果及其数量的映射表。
     */
    private HashMap<Fruit, Integer> fruits;

    /**
     * 当前应用的促销策略。
     */
    private Promotion promotion;

    /**
     * 构造函数初始化购物车。
     * 它创建一个空的水果映射表，并设置默认的促销策略。
     */
    public ShoppingCart() {
        this.fruits = new HashMap<>();
        this.promotion = new NoPromotion(); // 默认无促销
    }

    /**
     * 向购物车中添加水果。
     * 如果水果已存在于购物车中，则增加数量；否则，添加新水果并设置其数量。
     *
     * @param fruit 要添加的水果对象。
     * @param quantity 要添加的水果数量。
     */
    public void addFruit(Fruit fruit, int quantity) {
        fruits.put(fruit, fruits.getOrDefault(fruit, 0) + quantity);
    }

    /**
     * 计算购物车中所有水果的总价。
     * 总价是通过应用当前促销策略后的结果。
     *
     * @return 应用促销策略后的购物车总价。
     */
    public double calculateTotalPrice() {
        return promotion.applyPromotion(fruits);
    }
}
